Day 13- apply 家族函數
(前言:由於本人沒有接觸過程式語言及程式設計,寫的內容可能不是很正確,還請大家多多指教 :D)
今天要看的是R在數據處理方面最核心的函數:apply家族函數,這個函數家族有很多人(啊不是,應該是很多種),大致上比較常用到的有8種,分別是:apply, lapply, sapply, vapply, tapply, mapply, rapply, eapply。
在正式進入apply函數之前,我們先建立一個資料框,我用的程式碼如下:
col.1 <- c(rnorm(100))
col.2 <- c(rnorm(100))
col.3 <- c(rnorm(100))
col.4 <- c(rnorm(100))
col.5 <- c(rnorm(100))
col.6 <- c(rnorm(100))
col.7 <- c(rnorm(100))
col.9 <- c(rep(1, 10),rep(2,40), rep(3, 30), rep(4, 20))
kirbsaesthetics <- data.frame(col.1, col.2, col.3, col.4, col.5, col.6, col.7, col.8,col.9)
kirbsaesthetics
總共有9個欄,100個列
kirbsaesthetics
這個資料框實在太大,要處理資料的話會很麻煩,對吧。但是apply
家族函數就是設計來運算或修改大量資料的,所以,如果能夠學會使用appl
y家族函數的話,對資料分析會很有用,甚至可以不用寫for迴圈了
那我們正式進入apply家族函數吧。apply
函數的寫法是apply(變數名稱, 1或2(決定計算的是欄還是列),函數)
,如果要將函數的功能以欄為單位計算的話,就輸入1
,如果要以列為單位計算的話,就輸入2
,執行結果如下圖表示:
但是,我不想要每次都要寫那麼長的函數,還要冒著可能搞混1跟2的風險(被揍),因此,我們可以用一個叫lapply
(list apply)的函數簡化原本要寫的函數,這個函數會把data frame當作一個列表來執行函數(畢竟資料框就是一個有多個列的列表,可以用is.list
函數檢驗)。lapply
的寫法是lapply(data frame, 函數)
,執行結果會以列表方式計算回傳,範例:
Sapply
(simplify apply)則是lapply
的延伸版本,Sapply
會在背地裡呼叫lapply
,然後主動想要幫忙「簡化」計算結果。簡單來說,如果函數執行結果是一個列表,每個列表值長度為1,sapply
會回傳一個向量,如果函數執行結果是一個列表,每個列表的值是同樣長度的向量且長度大於1,sapply
會回傳一個矩陣, 否則sapply
會回傳一個列表。
這邊我們用lapply
和sapply
比對回傳的結果,用的函數是sum
,比對結果如下:sapply
把lapply
的資料簡化了,變成一個數值向量
其實,apply
家族函數的應用實在很多,可以組合不同函數、變數來計算不同種資料,我這邊也只有做最基礎的應用跟探討一下兩個函數不同的性質。
明天繼續寫apply家族的其他函數吧
參考資料: